{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"../Pierian-Data-Logo.PNG\">\n",
    "<br>\n",
    "<strong><center>Copyright 2019. Created by Jose Marcial Portilla.</center></strong>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Datasets with PyTorch\n",
    "In this section we'll show how to:\n",
    "* load data from outside files\n",
    "* build random batches using PyTorch's <a href='https://pytorch.org/docs/stable/data.html'><strong><tt>data</tt></strong></a> utilities<br>\n",
    "\n",
    "At the end we'll briefly mention <a href='https://pytorch.org/docs/stable/torchvision/index.html'><tt><strong>torchvision</strong></tt></a>."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Perform standard imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Loading data from files\n",
    "We've seen how to load NumPy arrays into PyTorch, and anyone familiar with <tt>pandas.read_csv()</tt> can use it to prepare data before forming tensors. Here we'll load the <a href='https://en.wikipedia.org/wiki/Iris_flower_data_set'>iris flower dataset</a> saved as a .csv file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "0                5.1               3.5                1.4               0.2   \n",
       "1                4.9               3.0                1.4               0.2   \n",
       "2                4.7               3.2                1.3               0.2   \n",
       "3                4.6               3.1                1.5               0.2   \n",
       "4                5.0               3.6                1.4               0.2   \n",
       "\n",
       "   target  \n",
       "0     0.0  \n",
       "1     0.0  \n",
       "2     0.0  \n",
       "3     0.0  \n",
       "4     0.0  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('../Data/iris.csv')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150, 5)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7jpbxW2DweC0AwcOvJDY1tvbi0AgYKfbjPr6+qCq8PuzGksVlFfqNF0PYHuaeV8F8L6qngRgOYBbCxAPeRzrSxER0WCVql5RclvjI42my7i5dpMbYnDcqlWjceONIezcWQ5VYOfOctx4YwirVo3OR/dr164dMWPGjAlz5849YeLEiZOBw1ehIpFI2fTp0yeecsopNSeffPLkP/3pT8MT133ggQdGXnTRRScm9nX++eefBACVlZVTdu7cGXjllVfKTzzxxMlXX3111eTJk2tef/318uXLlx9dXV196hlnnDHxiiuuCF177bVVALBgwYLxCxcuPBYAzjjjjInhcLhyypQpk6qrq0+Nb3vt2rUjzjvvvJMAoLu723fppZdWT5gwoWbChAk1v/nNb44EgPr6+qpTTz110kknnTT5xhtvHJ+Pzykbzg07AYjIcQDmAFgKYEGKRb4AYFHs5wcBrBQRUacvf5GnZaovxatNRERUquL1iuLptyPdEXzloa9AVdHT13OoraW95dA66ZZpWNMAAP1ucUvVf6rlnOSGGApiyZJKfPRR/4sXH33kw5IllXavNsVt2bLliBdeeGHrKaeccjCx/a677hpdV1fXfeutt+7q7e3F3r17+8VxySWX7Ln++utDe/bs8Y0cObLvvvvuG3XppZcOiKmzs3PoHXfc0bl69equzs7Osl/84hfjNm/evO3II4/sO+ussyZMnjz5w1Rx9fb2SkdHx/bf/e53FUuWLBl/wQUXvJo4//vf//64kSNHRl999dVtALB7924/ACxbtmzHscceG+3t7cVZZ5018bnnnhs2Y8aMlNtwgtNXmlYA+C6AvjTzKwG8CQCq2gugG8CAex5FpEFE2kWkfffu3U7FSh7B+lJERDQYpapXdDB68NBgKJ1Uy7i1dpMbYiiIXbvKs2rPwdSpU/cnD5gA4Mwzz9x/3333Hb1gwYLxzz///LBRo0b1+396WVkZZs2atef++++v6OnpwRNPPFFx5ZVXfpDcz7hx4w7W1dXtB4CNGzceMWPGjL3HHntsdMiQIXrJJZe8ny6uyy677H0AOOuss/a/9dZbA/Z3w4YNI2+88cZ34u/HjBkTBYB77rlndE1NzaSampqa1157beiLL744NJvPwy7HBk0icjGAd1R1U6bFUrQNuMqkqq2qOl1Vp48ZMyZvMZI3sb4UERENRvmuS+TG2k1uiKEgxo4dMJjJ2J6DYDCY8qLFhRdeuG/Dhg2vVFZWHpw/f/4JqZI0XHHFFe89+OCDo9esWTNy6tSpB5IHVsn9Z3OT2NChQxUAAoEAotHogLGAqkKkf/PLL79cvnLlymOffvrpV1999dVt559/fvdHyVfqHObkxs4G8HkR6QRwP4DzRWR10jJvATgeAEQkAKACQF4uSVLpYn0pIiIajPJdl8iNtZvcEENBLFy4A0OH9h+IDB3ah4ULdzi96VdffbW8srKy56abbnr36quvfnfz5s3B5GXmzJmzd+vWrcE77rjj6Msuu8z0/+bnnHPO/ueee27E7t27/T09PXjooYdG5RrfrFmz9ixbtuyY+Pvdu3f733//ff+wYcP6Ro8eHX3zzTcDTz31VEWu/efKsUGTqv5AVY9T1WoAVwB4QlWvTlrsYQBfiv18aWwZPs9EGbG+FBERDUap6hWV+8tR5ivLuF6qZdxau8kNMRTEdde9h+XLIxg37iBEgHHjDmL58ki+nmfK5LHHHhtRU1MzedKkSTUPPfTQqO9+97v/SF4mEAigrq6u++mnn664/PLLu836POGEE3puvPHGnZ/85CcnnX322RMnTJjwYUVFRTSX+H7605/u/OCDD/wnn3zy5IkTJ9asW7duxKc+9akPTz311AMnn3zy5Guuuaa6trZ2Xy592+F4ynEAEJFZAL6jqheLyBIA7ar6sIgMBfB/AUyDcYXpClV9I1NfTHNLRKWMKceJKJO2jjY0rW9CV3cXqiqqDg0mEtsuOvkirHttXcZlltYtTZlYIVX/hU7A4IYYCpJyvMR0d3f7Kioq+np6evC5z33upPnz57977bXXDngWqhjykXK8IIOmfOIXtXs0NhpXeKJRwO830n43Nxc7KiJv46CJiKj4OGjKXkNDw3EbNmwY+fHHH8u5556756677nrT5yvoY0dp5WPQ5GjKcSpdjY1Ay+GMpohGD7/nwInIPUTkeBhFxMfCyGTaqqq3JS0jAG4DcBGAAwDmq+rmQsdKVAqcvhLkdbleRXLD1SfKrLW19a1ix+AkXmminAQCxkApmd8P9PYWPh6iUpHvK00iMg7AOFXdLCIjAGwC8K+qui1hmYsAfAvGoGkGgNtUdUamfnksJhooucYQYDxPlFgjKZUyXxlEBAejhxOnBcuCaJ3bWlIDg1Sfj5X9zHU9O3ilqbTk40qTO66ZkeekGjBlaiei4lDVnfGrRqq6F8B2GDXyEn0BwL1q+B8AR8YGW0SUhVzrKPX09fQbMAGlWZso1xpMg6Z2E7kaB02UE78/u3YiKj4RqYaReOe5pFmHCo3HvIWBAysWGicy4XQdJa/LtQbToKndRK7GQRPlpKEhu3YiKi4RGQ7g9wBuUNU9ybNTrMJC40RZcrqOktflWoNp0NRuIlfjoIly0twMhMOHryz5/cZ7JoEgch8RKYMxYGpT1T+kWORQofGY4wC8XYjYiEpJrnWUynxlKPeX92srxdpEudZgGjS1m/IgGAxOSzdv2rRppxQylmRtbW0VP/zhD8fmsm6m/SoUDpooZ83NRtIHVeOVAyYi94llxvs1gO2quizNYg8DuFYMZwLoVtWdBQuSqETUT6lH69xWhCpCEAhCFSHc9YW7cPe/3t2vLTw93O/93f96N+76wl392kotCQSQ+vOxsp+5rud2q/66avT4/xg/xbfYVzv+P8ZPWfXXVaOd2E5vLEPXCy+88LIT/afbXrL6+vrun/zkJ7uKtX27mD2vxM2eDaxff/h9XR3w+OPFiycbbW1AUxPQ1QVUVQFLlwL13j4+kovZTWebr3S4DmTPmwlgI4AOGCnHAeCHAKoAQFVXxQZWKwFcACPl+JdVNeOBlsdiIiplTmfPW/XXVaNv/K8bQx/1fnToAsbQwNC+5Z9dHrnuk9e9l228ccFgcNqBAwdeWLt27Ygf/ehH44455piebdu2BV9//fWt8XmRSKRs3rx5J+7bt88fjUblV7/6VeSCCy7YF+/jgQceGPmb3/zm6HXr1r0BAGvXrh2xbNmyY5944om//+EPfxi5ZMmS8QcPHpRQKPTx/fff31lRUdFXWVk55corr3z3ySefHPn1r3/9nXfeeafs7rvvHuP3+3XChAkfrV279o1f/vKXR7W3tx9x7733dr355puBr3zlK6Gurq4hALBy5crIZz7zmf2LFi06tq2t7WgAuOaaa3YvXLjwncT96uvrQzgcPu6JJ56oEBG9+eabd/77v//7+6n2N+l3wzpNlF7ygAkw3s+e7f6BU1ub8XzUgViynEjk8PNSHDhRviWns410R9CwxviDs1o/xM76TlLVZ5D6maXEZRTANwoTEdHgk3xS5aTRJ+GpzqcQ1Sj84kdDbQOa5wy8XcOttYncGpeXLNmwpDJxwAQAH/V+5FuyYUmlnUFToi1bthzxwgsvbD3llFP6pWa86667RtfV1XXfeuutu3p7e7F3795+cVxyySV7rr/++tCePXt8I0eO7LvvvvtGXXrppe/t3Lkz8JOf/GTchg0bXh05cmRfU1PT2B/96EfH/uIXv9gJAEOHDu3btGnTKwBwzDHHTI1EIh3Dhg3Td999d0CasOuuu67qnHPO2btw4cLXe3t70d3d7d+4cWPwt7/97VGbNm3arqqora2dVFdXt/fss8/+ML7evffee2RHR8ew7du3b925c2fgjDPOmPTZz352X6b9zRfenlfCkgdMZu1u0tR0eMAUd+CA0U6Ub3bT2TIdLhGlEz+pEumOQKGIdEew/v+tR1SNGh1RjaKlvQWNjzSartewpgFtHW3F2A3Xx+U1u/btKs+mPRdTp07dn2oAceaZZ+6/7777jl6wYMH4559/ftioUaP6EueXlZVh1qxZe+6///6Knp4ePPHEExVXXnnlB0899dQRr7/++tAzzjjjlFNOOaXm/vvvP6qrq+tQvNdee+378Z8nTpz44SWXXHJCc3Pz6LKysgG3tT377LMjbr755t0AEAgEcNRRR0Wfeuqp4RdddNEHI0eO7KuoqOibM2fO+08++eSIxPU2btw44otf/OJ7gUAAxx9/fO+MGTP2PfPMM8FM+5svHDSRK3WlySKarp3IDrvpbJkOl4jSSXVSJZXWTa2m67nhZIxb4/KascPHpvzPfbr2XASDwb5U7RdeeOG+DRs2vFJZWXlw/vz5J6xcufKo5GWuuOKK9x588MHRa9asGTl16tQDo0aN6lNVzJw5c8/LL7+87eWXX972+uuvb33ggQci8XVGjBhxaHtPPvnka9/4xjd2b9q06YjTTjutpqcnc60yALDyyFCmZdLtb75w0ESuVJUmi2i6diI77KazZTpcIkrH6smT+JUns/WKfTLGrXF5zcJPL9wxNDC033/yhwaG9i389MIdTm/71VdfLa+srOy56aab3r366qvf3bx5czB5mTlz5uzdunVr8I477jj6sssuew8AZs2atb+9vX34Sy+9NAQA9u7d69uyZcuQ5HWj0Shef/318rlz5+5tbm5+a+/evf7u7u5+t+idffbZe3/+85+PAYzEDe+9957v/PPP37du3boj9+7d69uzZ49v3bp1o84777y9ieud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\n",
      "text/plain": [
       "<Figure size 720x504 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,7))\n",
    "fig.tight_layout()\n",
    "\n",
    "plots = [(0,1),(2,3),(0,2),(1,3)]\n",
    "colors = ['b', 'r', 'g']\n",
    "labels = ['Iris setosa','Iris virginica','Iris versicolor']\n",
    "\n",
    "for i, ax in enumerate(axes.flat):\n",
    "    for j in range(3):\n",
    "        x = df.columns[plots[i][0]]\n",
    "        y = df.columns[plots[i][1]]\n",
    "        ax.scatter(df[df['target']==j][x], df[df['target']==j][y], color=colors[j])\n",
    "        ax.set(xlabel=x, ylabel=y)\n",
    "\n",
    "fig.legend(labels=labels, loc=3, bbox_to_anchor=(1.0,0.85))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The iris dataset consists of 50 samples each from three species of Iris (<em>Iris setosa</em>, <em>Iris virginica</em> and <em>Iris versicolor</em>), for 150 total samples. We have four features (sepal length & width, petal length & width) and three unique labels:\n",
    "0. <em>Iris setosa</em>\n",
    "1. <em>Iris virginica</em>\n",
    "2. <em>Iris versicolor</em>\n",
    "\n",
    "### The classic method for building train/test split tensors\n",
    "Before introducing PyTorch's Dataset and DataLoader classes, we'll take a quick look at the alternative."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "train_X, test_X, train_y, test_y = train_test_split(df.drop('target',axis=1).values,\n",
    "                                                    df['target'].values, test_size=0.2,\n",
    "                                                    random_state=33)\n",
    "\n",
    "X_train = torch.FloatTensor(train_X)\n",
    "X_test = torch.FloatTensor(test_X)\n",
    "y_train = torch.LongTensor(train_y).reshape(-1, 1)\n",
    "y_test = torch.LongTensor(test_y).reshape(-1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training size: 120\n",
      "Labels: tensor([0, 1, 2])\n",
      "Counts: tensor([42, 42, 36])\n"
     ]
    }
   ],
   "source": [
    "print(f'Training size: {len(y_train)}')\n",
    "labels, counts = y_train.unique(return_counts=True)\n",
    "print(f'Labels: {labels}\\nCounts: {counts}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-success\"><strong>NOTE: </strong>The importance of a balanced training set is discussed in <em>A systematic study of the class imbalance problem in convolutional neural networks</em> by Mateusz Buda, Atsuto Maki, Maciej A. Mazurowski (10/15/17, latest rev 10/13/18) <a href='https://arxiv.org/abs/1710.05381'>https://arxiv.org/abs/1710.05381</a><br>For example, the authors show that oversampling a less common class so that it matches the more common classes is always the preferred choice.</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([120, 4])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([120, 1])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.size()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\"><strong>NOTE: </strong>It's up to us to remember which columns correspond to which features.</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using PyTorch's Dataset and DataLoader classes\n",
    "A far better alternative is to leverage PyTorch's <a href='https://pytorch.org/docs/stable/data.html'><strong><tt>Dataset</tt></strong></a> and <a href='https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader'><strong><tt>DataLoader</strong></tt></a> classes.\n",
    "\n",
    "Usually, to set up a Dataset specific to our investigation we would define our own custom class that inherits from <tt>torch.utils.data.Dataset</tt> (we'll do this in the CNN section). For now, we can use the built-in <a href='https://pytorch.org/docs/stable/data.html#torch.utils.data.TensorDataset'><strong><tt>TensorDataset</tt></strong></a> class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import TensorDataset, DataLoader\n",
    "\n",
    "data = df.drop('target',axis=1).values\n",
    "labels = df['target'].values\n",
    "\n",
    "iris = TensorDataset(torch.FloatTensor(data),torch.LongTensor(labels))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "150"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.utils.data.dataset.TensorDataset"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([5.1000, 3.5000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([4.9000, 3.0000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([4.7000, 3.2000, 1.3000, 0.2000]), tensor(0))\n",
      "(tensor([4.6000, 3.1000, 1.5000, 0.2000]), tensor(0))\n",
      "(tensor([5.0000, 3.6000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([5.4000, 3.9000, 1.7000, 0.4000]), tensor(0))\n",
      "(tensor([4.6000, 3.4000, 1.4000, 0.3000]), tensor(0))\n",
      "(tensor([5.0000, 3.4000, 1.5000, 0.2000]), tensor(0))\n",
      "(tensor([4.4000, 2.9000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([4.9000, 3.1000, 1.5000, 0.1000]), tensor(0))\n",
      "(tensor([5.4000, 3.7000, 1.5000, 0.2000]), tensor(0))\n",
      "(tensor([4.8000, 3.4000, 1.6000, 0.2000]), tensor(0))\n",
      "(tensor([4.8000, 3.0000, 1.4000, 0.1000]), tensor(0))\n",
      "(tensor([4.3000, 3.0000, 1.1000, 0.1000]), tensor(0))\n",
      "(tensor([5.8000, 4.0000, 1.2000, 0.2000]), tensor(0))\n",
      "(tensor([5.7000, 4.4000, 1.5000, 0.4000]), tensor(0))\n",
      "(tensor([5.4000, 3.9000, 1.3000, 0.4000]), tensor(0))\n",
      "(tensor([5.1000, 3.5000, 1.4000, 0.3000]), tensor(0))\n",
      "(tensor([5.7000, 3.8000, 1.7000, 0.3000]), tensor(0))\n",
      "(tensor([5.1000, 3.8000, 1.5000, 0.3000]), tensor(0))\n",
      "(tensor([5.4000, 3.4000, 1.7000, 0.2000]), tensor(0))\n",
      "(tensor([5.1000, 3.7000, 1.5000, 0.4000]), tensor(0))\n",
      "(tensor([4.6000, 3.6000, 1.0000, 0.2000]), tensor(0))\n",
      "(tensor([5.1000, 3.3000, 1.7000, 0.5000]), tensor(0))\n",
      "(tensor([4.8000, 3.4000, 1.9000, 0.2000]), tensor(0))\n",
      "(tensor([5.0000, 3.0000, 1.6000, 0.2000]), tensor(0))\n",
      "(tensor([5.0000, 3.4000, 1.6000, 0.4000]), tensor(0))\n",
      "(tensor([5.2000, 3.5000, 1.5000, 0.2000]), tensor(0))\n",
      "(tensor([5.2000, 3.4000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([4.7000, 3.2000, 1.6000, 0.2000]), tensor(0))\n",
      "(tensor([4.8000, 3.1000, 1.6000, 0.2000]), tensor(0))\n",
      "(tensor([5.4000, 3.4000, 1.5000, 0.4000]), tensor(0))\n",
      "(tensor([5.2000, 4.1000, 1.5000, 0.1000]), tensor(0))\n",
      "(tensor([5.5000, 4.2000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([4.9000, 3.1000, 1.5000, 0.1000]), tensor(0))\n",
      "(tensor([5.0000, 3.2000, 1.2000, 0.2000]), tensor(0))\n",
      "(tensor([5.5000, 3.5000, 1.3000, 0.2000]), tensor(0))\n",
      "(tensor([4.9000, 3.1000, 1.5000, 0.1000]), tensor(0))\n",
      "(tensor([4.4000, 3.0000, 1.3000, 0.2000]), tensor(0))\n",
      "(tensor([5.1000, 3.4000, 1.5000, 0.2000]), tensor(0))\n",
      "(tensor([5.0000, 3.5000, 1.3000, 0.3000]), tensor(0))\n",
      "(tensor([4.5000, 2.3000, 1.3000, 0.3000]), tensor(0))\n",
      "(tensor([4.4000, 3.2000, 1.3000, 0.2000]), tensor(0))\n",
      "(tensor([5.0000, 3.5000, 1.6000, 0.6000]), tensor(0))\n",
      "(tensor([5.1000, 3.8000, 1.9000, 0.4000]), tensor(0))\n",
      "(tensor([4.8000, 3.0000, 1.4000, 0.3000]), tensor(0))\n",
      "(tensor([5.1000, 3.8000, 1.6000, 0.2000]), tensor(0))\n",
      "(tensor([4.6000, 3.2000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([5.3000, 3.7000, 1.5000, 0.2000]), tensor(0))\n",
      "(tensor([5.0000, 3.3000, 1.4000, 0.2000]), tensor(0))\n",
      "(tensor([7.0000, 3.2000, 4.7000, 1.4000]), tensor(1))\n",
      "(tensor([6.4000, 3.2000, 4.5000, 1.5000]), tensor(1))\n",
      "(tensor([6.9000, 3.1000, 4.9000, 1.5000]), tensor(1))\n",
      "(tensor([5.5000, 2.3000, 4.0000, 1.3000]), tensor(1))\n",
      "(tensor([6.5000, 2.8000, 4.6000, 1.5000]), tensor(1))\n",
      "(tensor([5.7000, 2.8000, 4.5000, 1.3000]), tensor(1))\n",
      "(tensor([6.3000, 3.3000, 4.7000, 1.6000]), tensor(1))\n",
      "(tensor([4.9000, 2.4000, 3.3000, 1.0000]), tensor(1))\n",
      "(tensor([6.6000, 2.9000, 4.6000, 1.3000]), tensor(1))\n",
      "(tensor([5.2000, 2.7000, 3.9000, 1.4000]), tensor(1))\n",
      "(tensor([5.0000, 2.0000, 3.5000, 1.0000]), tensor(1))\n",
      "(tensor([5.9000, 3.0000, 4.2000, 1.5000]), tensor(1))\n",
      "(tensor([6.0000, 2.2000, 4.0000, 1.0000]), tensor(1))\n",
      "(tensor([6.1000, 2.9000, 4.7000, 1.4000]), tensor(1))\n",
      "(tensor([5.6000, 2.9000, 3.6000, 1.3000]), tensor(1))\n",
      "(tensor([6.7000, 3.1000, 4.4000, 1.4000]), tensor(1))\n",
      "(tensor([5.6000, 3.0000, 4.5000, 1.5000]), tensor(1))\n",
      "(tensor([5.8000, 2.7000, 4.1000, 1.0000]), tensor(1))\n",
      "(tensor([6.2000, 2.2000, 4.5000, 1.5000]), tensor(1))\n",
      "(tensor([5.6000, 2.5000, 3.9000, 1.1000]), tensor(1))\n",
      "(tensor([5.9000, 3.2000, 4.8000, 1.8000]), tensor(1))\n",
      "(tensor([6.1000, 2.8000, 4.0000, 1.3000]), tensor(1))\n",
      "(tensor([6.3000, 2.5000, 4.9000, 1.5000]), tensor(1))\n",
      "(tensor([6.1000, 2.8000, 4.7000, 1.2000]), tensor(1))\n",
      "(tensor([6.4000, 2.9000, 4.3000, 1.3000]), tensor(1))\n",
      "(tensor([6.6000, 3.0000, 4.4000, 1.4000]), tensor(1))\n",
      "(tensor([6.8000, 2.8000, 4.8000, 1.4000]), tensor(1))\n",
      "(tensor([6.7000, 3.0000, 5.0000, 1.7000]), tensor(1))\n",
      "(tensor([6.0000, 2.9000, 4.5000, 1.5000]), tensor(1))\n",
      "(tensor([5.7000, 2.6000, 3.5000, 1.0000]), tensor(1))\n",
      "(tensor([5.5000, 2.4000, 3.8000, 1.1000]), tensor(1))\n",
      "(tensor([5.5000, 2.4000, 3.7000, 1.0000]), tensor(1))\n",
      "(tensor([5.8000, 2.7000, 3.9000, 1.2000]), tensor(1))\n",
      "(tensor([6.0000, 2.7000, 5.1000, 1.6000]), tensor(1))\n",
      "(tensor([5.4000, 3.0000, 4.5000, 1.5000]), tensor(1))\n",
      "(tensor([6.0000, 3.4000, 4.5000, 1.6000]), tensor(1))\n",
      "(tensor([6.7000, 3.1000, 4.7000, 1.5000]), tensor(1))\n",
      "(tensor([6.3000, 2.3000, 4.4000, 1.3000]), tensor(1))\n",
      "(tensor([5.6000, 3.0000, 4.1000, 1.3000]), tensor(1))\n",
      "(tensor([5.5000, 2.5000, 4.0000, 1.3000]), tensor(1))\n",
      "(tensor([5.5000, 2.6000, 4.4000, 1.2000]), tensor(1))\n",
      "(tensor([6.1000, 3.0000, 4.6000, 1.4000]), tensor(1))\n",
      "(tensor([5.8000, 2.6000, 4.0000, 1.2000]), tensor(1))\n",
      "(tensor([5.0000, 2.3000, 3.3000, 1.0000]), tensor(1))\n",
      "(tensor([5.6000, 2.7000, 4.2000, 1.3000]), tensor(1))\n",
      "(tensor([5.7000, 3.0000, 4.2000, 1.2000]), tensor(1))\n",
      "(tensor([5.7000, 2.9000, 4.2000, 1.3000]), tensor(1))\n",
      "(tensor([6.2000, 2.9000, 4.3000, 1.3000]), tensor(1))\n",
      "(tensor([5.1000, 2.5000, 3.0000, 1.1000]), tensor(1))\n",
      "(tensor([5.7000, 2.8000, 4.1000, 1.3000]), tensor(1))\n",
      "(tensor([6.3000, 3.3000, 6.0000, 2.5000]), tensor(2))\n",
      "(tensor([5.8000, 2.7000, 5.1000, 1.9000]), tensor(2))\n",
      "(tensor([7.1000, 3.0000, 5.9000, 2.1000]), tensor(2))\n",
      "(tensor([6.3000, 2.9000, 5.6000, 1.8000]), tensor(2))\n",
      "(tensor([6.5000, 3.0000, 5.8000, 2.2000]), tensor(2))\n",
      "(tensor([7.6000, 3.0000, 6.6000, 2.1000]), tensor(2))\n",
      "(tensor([4.9000, 2.5000, 4.5000, 1.7000]), tensor(2))\n",
      "(tensor([7.3000, 2.9000, 6.3000, 1.8000]), tensor(2))\n",
      "(tensor([6.7000, 2.5000, 5.8000, 1.8000]), tensor(2))\n",
      "(tensor([7.2000, 3.6000, 6.1000, 2.5000]), tensor(2))\n",
      "(tensor([6.5000, 3.2000, 5.1000, 2.0000]), tensor(2))\n",
      "(tensor([6.4000, 2.7000, 5.3000, 1.9000]), tensor(2))\n",
      "(tensor([6.8000, 3.0000, 5.5000, 2.1000]), tensor(2))\n",
      "(tensor([5.7000, 2.5000, 5.0000, 2.0000]), tensor(2))\n",
      "(tensor([5.8000, 2.8000, 5.1000, 2.4000]), tensor(2))\n",
      "(tensor([6.4000, 3.2000, 5.3000, 2.3000]), tensor(2))\n",
      "(tensor([6.5000, 3.0000, 5.5000, 1.8000]), tensor(2))\n",
      "(tensor([7.7000, 3.8000, 6.7000, 2.2000]), tensor(2))\n",
      "(tensor([7.7000, 2.6000, 6.9000, 2.3000]), tensor(2))\n",
      "(tensor([6.0000, 2.2000, 5.0000, 1.5000]), tensor(2))\n",
      "(tensor([6.9000, 3.2000, 5.7000, 2.3000]), tensor(2))\n",
      "(tensor([5.6000, 2.8000, 4.9000, 2.0000]), tensor(2))\n",
      "(tensor([7.7000, 2.8000, 6.7000, 2.0000]), tensor(2))\n",
      "(tensor([6.3000, 2.7000, 4.9000, 1.8000]), tensor(2))\n",
      "(tensor([6.7000, 3.3000, 5.7000, 2.1000]), tensor(2))\n",
      "(tensor([7.2000, 3.2000, 6.0000, 1.8000]), tensor(2))\n",
      "(tensor([6.2000, 2.8000, 4.8000, 1.8000]), tensor(2))\n",
      "(tensor([6.1000, 3.0000, 4.9000, 1.8000]), tensor(2))\n",
      "(tensor([6.4000, 2.8000, 5.6000, 2.1000]), tensor(2))\n",
      "(tensor([7.2000, 3.0000, 5.8000, 1.6000]), tensor(2))\n",
      "(tensor([7.4000, 2.8000, 6.1000, 1.9000]), tensor(2))\n",
      "(tensor([7.9000, 3.8000, 6.4000, 2.0000]), tensor(2))\n",
      "(tensor([6.4000, 2.8000, 5.6000, 2.2000]), tensor(2))\n",
      "(tensor([6.3000, 2.8000, 5.1000, 1.5000]), tensor(2))\n",
      "(tensor([6.1000, 2.6000, 5.6000, 1.4000]), tensor(2))\n",
      "(tensor([7.7000, 3.0000, 6.1000, 2.3000]), tensor(2))\n",
      "(tensor([6.3000, 3.4000, 5.6000, 2.4000]), tensor(2))\n",
      "(tensor([6.4000, 3.1000, 5.5000, 1.8000]), tensor(2))\n",
      "(tensor([6.0000, 3.0000, 4.8000, 1.8000]), tensor(2))\n",
      "(tensor([6.9000, 3.1000, 5.4000, 2.1000]), tensor(2))\n",
      "(tensor([6.7000, 3.1000, 5.6000, 2.4000]), tensor(2))\n",
      "(tensor([6.9000, 3.1000, 5.1000, 2.3000]), tensor(2))\n",
      "(tensor([5.8000, 2.7000, 5.1000, 1.9000]), tensor(2))\n",
      "(tensor([6.8000, 3.2000, 5.9000, 2.3000]), tensor(2))\n",
      "(tensor([6.7000, 3.3000, 5.7000, 2.5000]), tensor(2))\n",
      "(tensor([6.7000, 3.0000, 5.2000, 2.3000]), tensor(2))\n",
      "(tensor([6.3000, 2.5000, 5.0000, 1.9000]), tensor(2))\n",
      "(tensor([6.5000, 3.0000, 5.2000, 2.0000]), tensor(2))\n",
      "(tensor([6.2000, 3.4000, 5.4000, 2.3000]), tensor(2))\n",
      "(tensor([5.9000, 3.0000, 5.1000, 1.8000]), tensor(2))\n"
     ]
    }
   ],
   "source": [
    "for i in iris:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we have a dataset we can wrap it with a DataLoader. This gives us a powerful sampler that provides single- or multi-process iterators over the dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris_loader = DataLoader(iris, batch_size=105, shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 [tensor([[6.4000, 3.1000, 5.5000, 1.8000],\n",
      "        [6.7000, 3.1000, 5.6000, 2.4000],\n",
      "        [7.0000, 3.2000, 4.7000, 1.4000],\n",
      "        [5.0000, 3.0000, 1.6000, 0.2000],\n",
      "        [6.3000, 2.8000, 5.1000, 1.5000],\n",
      "        [5.7000, 4.4000, 1.5000, 0.4000],\n",
      "        [5.4000, 3.7000, 1.5000, 0.2000],\n",
      "        [4.9000, 3.1000, 1.5000, 0.1000],\n",
      "        [7.2000, 3.0000, 5.8000, 1.6000],\n",
      "        [7.1000, 3.0000, 5.9000, 2.1000],\n",
      "        [5.0000, 3.5000, 1.3000, 0.3000],\n",
      "        [5.4000, 3.4000, 1.7000, 0.2000],\n",
      "        [6.9000, 3.1000, 5.4000, 2.1000],\n",
      "        [6.2000, 2.8000, 4.8000, 1.8000],\n",
      "        [6.7000, 2.5000, 5.8000, 1.8000],\n",
      "        [5.1000, 3.8000, 1.5000, 0.3000],\n",
      "        [5.1000, 2.5000, 3.0000, 1.1000],\n",
      "        [5.6000, 2.9000, 3.6000, 1.3000],\n",
      "        [5.5000, 2.4000, 3.8000, 1.1000],\n",
      "        [6.9000, 3.1000, 5.1000, 2.3000],\n",
      "        [6.0000, 3.0000, 4.8000, 1.8000],\n",
      "        [5.5000, 2.5000, 4.0000, 1.3000],\n",
      "        [4.7000, 3.2000, 1.6000, 0.2000],\n",
      "        [6.3000, 2.7000, 4.9000, 1.8000],\n",
      "        [6.5000, 3.0000, 5.2000, 2.0000],\n",
      "        [5.1000, 3.5000, 1.4000, 0.3000],\n",
      "        [5.8000, 2.7000, 5.1000, 1.9000],\n",
      "        [5.8000, 2.6000, 4.0000, 1.2000],\n",
      "        [6.9000, 3.1000, 4.9000, 1.5000],\n",
      "        [6.3000, 2.9000, 5.6000, 1.8000],\n",
      "        [5.6000, 3.0000, 4.1000, 1.3000],\n",
      "        [7.3000, 2.9000, 6.3000, 1.8000],\n",
      "        [6.1000, 3.0000, 4.9000, 1.8000],\n",
      "        [5.5000, 2.6000, 4.4000, 1.2000],\n",
      "        [5.9000, 3.0000, 4.2000, 1.5000],\n",
      "        [5.1000, 3.8000, 1.6000, 0.2000],\n",
      "        [5.0000, 3.3000, 1.4000, 0.2000],\n",
      "        [5.2000, 2.7000, 3.9000, 1.4000],\n",
      "        [6.3000, 2.3000, 4.4000, 1.3000],\n",
      "        [6.0000, 2.9000, 4.5000, 1.5000],\n",
      "        [5.4000, 3.9000, 1.7000, 0.4000],\n",
      "        [6.5000, 3.0000, 5.8000, 2.2000],\n",
      "        [6.8000, 3.2000, 5.9000, 2.3000],\n",
      "        [6.3000, 2.5000, 4.9000, 1.5000],\n",
      "        [6.1000, 2.8000, 4.0000, 1.3000],\n",
      "        [6.2000, 3.4000, 5.4000, 2.3000],\n",
      "        [5.0000, 3.6000, 1.4000, 0.2000],\n",
      "        [6.4000, 2.8000, 5.6000, 2.2000],\n",
      "        [5.2000, 4.1000, 1.5000, 0.1000],\n",
      "        [4.9000, 3.1000, 1.5000, 0.1000],\n",
      "        [6.7000, 3.1000, 4.7000, 1.5000],\n",
      "        [4.6000, 3.6000, 1.0000, 0.2000],\n",
      "        [5.2000, 3.4000, 1.4000, 0.2000],\n",
      "        [6.3000, 3.3000, 6.0000, 2.5000],\n",
      "        [6.7000, 3.3000, 5.7000, 2.1000],\n",
      "        [5.9000, 3.0000, 5.1000, 1.8000],\n",
      "        [4.7000, 3.2000, 1.3000, 0.2000],\n",
      "        [4.9000, 3.1000, 1.5000, 0.1000],\n",
      "        [4.8000, 3.4000, 1.9000, 0.2000],\n",
      "        [5.1000, 3.7000, 1.5000, 0.4000],\n",
      "        [6.0000, 3.4000, 4.5000, 1.6000],\n",
      "        [5.0000, 3.5000, 1.6000, 0.6000],\n",
      "        [4.8000, 3.0000, 1.4000, 0.3000],\n",
      "        [6.1000, 3.0000, 4.6000, 1.4000],\n",
      "        [5.1000, 3.8000, 1.9000, 0.4000],\n",
      "        [5.8000, 4.0000, 1.2000, 0.2000],\n",
      "        [6.4000, 2.9000, 4.3000, 1.3000],\n",
      "        [4.4000, 3.0000, 1.3000, 0.2000],\n",
      "        [5.7000, 3.0000, 4.2000, 1.2000],\n",
      "        [5.5000, 4.2000, 1.4000, 0.2000],\n",
      "        [4.6000, 3.2000, 1.4000, 0.2000],\n",
      "        [5.1000, 3.5000, 1.4000, 0.2000],\n",
      "        [5.1000, 3.4000, 1.5000, 0.2000],\n",
      "        [6.5000, 3.2000, 5.1000, 2.0000],\n",
      "        [4.4000, 3.2000, 1.3000, 0.2000],\n",
      "        [6.6000, 3.0000, 4.4000, 1.4000],\n",
      "        [7.7000, 2.8000, 6.7000, 2.0000],\n",
      "        [5.0000, 3.2000, 1.2000, 0.2000],\n",
      "        [5.5000, 2.4000, 3.7000, 1.0000],\n",
      "        [5.7000, 2.8000, 4.5000, 1.3000],\n",
      "        [4.3000, 3.0000, 1.1000, 0.1000],\n",
      "        [5.8000, 2.7000, 5.1000, 1.9000],\n",
      "        [4.6000, 3.4000, 1.4000, 0.3000],\n",
      "        [6.7000, 3.0000, 5.2000, 2.3000],\n",
      "        [7.4000, 2.8000, 6.1000, 1.9000],\n",
      "        [7.7000, 3.8000, 6.7000, 2.2000],\n",
      "        [4.9000, 3.0000, 1.4000, 0.2000],\n",
      "        [4.5000, 2.3000, 1.3000, 0.3000],\n",
      "        [5.8000, 2.8000, 5.1000, 2.4000],\n",
      "        [5.6000, 2.5000, 3.9000, 1.1000],\n",
      "        [6.3000, 3.3000, 4.7000, 1.6000],\n",
      "        [6.4000, 3.2000, 4.5000, 1.5000],\n",
      "        [6.7000, 3.3000, 5.7000, 2.5000],\n",
      "        [5.8000, 2.7000, 3.9000, 1.2000],\n",
      "        [6.3000, 2.5000, 5.0000, 1.9000],\n",
      "        [4.8000, 3.4000, 1.6000, 0.2000],\n",
      "        [5.6000, 2.8000, 4.9000, 2.0000],\n",
      "        [6.2000, 2.2000, 4.5000, 1.5000],\n",
      "        [7.6000, 3.0000, 6.6000, 2.1000],\n",
      "        [5.0000, 2.0000, 3.5000, 1.0000],\n",
      "        [6.4000, 3.2000, 5.3000, 2.3000],\n",
      "        [5.0000, 2.3000, 3.3000, 1.0000],\n",
      "        [5.7000, 2.6000, 3.5000, 1.0000],\n",
      "        [4.8000, 3.0000, 1.4000, 0.1000],\n",
      "        [6.4000, 2.8000, 5.6000, 2.1000]]), tensor([2, 2, 1, 0, 2, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 0, 1, 1, 1, 2, 2, 1, 0, 2,\n",
      "        2, 0, 2, 1, 1, 2, 1, 2, 2, 1, 1, 0, 0, 1, 1, 1, 0, 2, 2, 1, 1, 2, 0, 2,\n",
      "        0, 0, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0,\n",
      "        0, 2, 0, 1, 2, 0, 1, 1, 0, 2, 0, 2, 2, 2, 0, 0, 2, 1, 1, 1, 2, 1, 2, 0,\n",
      "        2, 1, 2, 1, 2, 1, 1, 0, 2])]\n",
      "1 [tensor([[5.6000, 2.7000, 4.2000, 1.3000],\n",
      "        [4.8000, 3.1000, 1.6000, 0.2000],\n",
      "        [6.7000, 3.1000, 4.4000, 1.4000],\n",
      "        [5.5000, 3.5000, 1.3000, 0.2000],\n",
      "        [5.7000, 2.9000, 4.2000, 1.3000],\n",
      "        [5.6000, 3.0000, 4.5000, 1.5000],\n",
      "        [7.9000, 3.8000, 6.4000, 2.0000],\n",
      "        [5.5000, 2.3000, 4.0000, 1.3000],\n",
      "        [4.9000, 2.5000, 4.5000, 1.7000],\n",
      "        [6.8000, 2.8000, 4.8000, 1.4000],\n",
      "        [4.4000, 2.9000, 1.4000, 0.2000],\n",
      "        [5.2000, 3.5000, 1.5000, 0.2000],\n",
      "        [7.2000, 3.2000, 6.0000, 1.8000],\n",
      "        [6.4000, 2.7000, 5.3000, 1.9000],\n",
      "        [6.0000, 2.2000, 4.0000, 1.0000],\n",
      "        [5.7000, 2.5000, 5.0000, 2.0000],\n",
      "        [5.7000, 2.8000, 4.1000, 1.3000],\n",
      "        [6.5000, 2.8000, 4.6000, 1.5000],\n",
      "        [6.0000, 2.2000, 5.0000, 1.5000],\n",
      "        [6.2000, 2.9000, 4.3000, 1.3000],\n",
      "        [7.7000, 2.6000, 6.9000, 2.3000],\n",
      "        [5.8000, 2.7000, 4.1000, 1.0000],\n",
      "        [5.3000, 3.7000, 1.5000, 0.2000],\n",
      "        [6.1000, 2.6000, 5.6000, 1.4000],\n",
      "        [6.8000, 3.0000, 5.5000, 2.1000],\n",
      "        [5.1000, 3.3000, 1.7000, 0.5000],\n",
      "        [7.7000, 3.0000, 6.1000, 2.3000],\n",
      "        [5.4000, 3.0000, 4.5000, 1.5000],\n",
      "        [5.0000, 3.4000, 1.6000, 0.4000],\n",
      "        [6.1000, 2.8000, 4.7000, 1.2000],\n",
      "        [5.4000, 3.9000, 1.3000, 0.4000],\n",
      "        [7.2000, 3.6000, 6.1000, 2.5000],\n",
      "        [6.3000, 3.4000, 5.6000, 2.4000],\n",
      "        [6.0000, 2.7000, 5.1000, 1.6000],\n",
      "        [6.1000, 2.9000, 4.7000, 1.4000],\n",
      "        [5.7000, 3.8000, 1.7000, 0.3000],\n",
      "        [6.5000, 3.0000, 5.5000, 1.8000],\n",
      "        [5.4000, 3.4000, 1.5000, 0.4000],\n",
      "        [5.9000, 3.2000, 4.8000, 1.8000],\n",
      "        [6.7000, 3.0000, 5.0000, 1.7000],\n",
      "        [4.9000, 2.4000, 3.3000, 1.0000],\n",
      "        [6.9000, 3.2000, 5.7000, 2.3000],\n",
      "        [5.0000, 3.4000, 1.5000, 0.2000],\n",
      "        [6.6000, 2.9000, 4.6000, 1.3000],\n",
      "        [4.6000, 3.1000, 1.5000, 0.2000]]), tensor([1, 0, 1, 0, 1, 1, 2, 1, 2, 1, 0, 0, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0, 2,\n",
      "        2, 0, 2, 1, 0, 1, 0, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 2, 0, 1, 0])]\n"
     ]
    }
   ],
   "source": [
    "for i_batch, sample_batched in enumerate(iris_loader):\n",
    "    print(i_batch, sample_batched)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([34, 34, 37])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(iris_loader)[0][1].bincount()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[tensor([[5.9000, 3.2000, 4.8000, 1.8000],\n",
       "         [6.4000, 2.7000, 5.3000, 1.9000],\n",
       "         [5.4000, 3.7000, 1.5000, 0.2000],\n",
       "         [6.4000, 3.1000, 5.5000, 1.8000],\n",
       "         [4.9000, 3.1000, 1.5000, 0.1000],\n",
       "         [5.3000, 3.7000, 1.5000, 0.2000],\n",
       "         [4.4000, 3.2000, 1.3000, 0.2000],\n",
       "         [6.5000, 3.0000, 5.5000, 1.8000],\n",
       "         [6.7000, 3.3000, 5.7000, 2.1000],\n",
       "         [7.7000, 2.8000, 6.7000, 2.0000],\n",
       "         [7.1000, 3.0000, 5.9000, 2.1000],\n",
       "         [5.4000, 3.4000, 1.7000, 0.2000],\n",
       "         [6.5000, 2.8000, 4.6000, 1.5000],\n",
       "         [5.8000, 2.6000, 4.0000, 1.2000],\n",
       "         [7.6000, 3.0000, 6.6000, 2.1000],\n",
       "         [6.3000, 2.9000, 5.6000, 1.8000],\n",
       "         [5.4000, 3.9000, 1.3000, 0.4000],\n",
       "         [7.7000, 3.8000, 6.7000, 2.2000],\n",
       "         [4.9000, 3.1000, 1.5000, 0.1000],\n",
       "         [5.6000, 2.9000, 3.6000, 1.3000],\n",
       "         [4.3000, 3.0000, 1.1000, 0.1000],\n",
       "         [4.5000, 2.3000, 1.3000, 0.3000],\n",
       "         [6.7000, 3.3000, 5.7000, 2.5000],\n",
       "         [7.4000, 2.8000, 6.1000, 1.9000],\n",
       "         [5.1000, 3.8000, 1.6000, 0.2000],\n",
       "         [4.9000, 2.5000, 4.5000, 1.7000],\n",
       "         [6.4000, 2.8000, 5.6000, 2.2000],\n",
       "         [4.8000, 3.0000, 1.4000, 0.1000],\n",
       "         [6.3000, 3.3000, 4.7000, 1.6000],\n",
       "         [6.3000, 2.5000, 5.0000, 1.9000],\n",
       "         [6.3000, 2.3000, 4.4000, 1.3000],\n",
       "         [6.7000, 3.0000, 5.2000, 2.3000],\n",
       "         [5.7000, 2.8000, 4.5000, 1.3000],\n",
       "         [5.0000, 3.6000, 1.4000, 0.2000],\n",
       "         [6.9000, 3.1000, 5.1000, 2.3000],\n",
       "         [5.8000, 2.7000, 3.9000, 1.2000],\n",
       "         [7.3000, 2.9000, 6.3000, 1.8000],\n",
       "         [5.6000, 3.0000, 4.5000, 1.5000],\n",
       "         [6.4000, 2.8000, 5.6000, 2.1000],\n",
       "         [5.5000, 4.2000, 1.4000, 0.2000],\n",
       "         [6.2000, 2.9000, 4.3000, 1.3000],\n",
       "         [4.6000, 3.1000, 1.5000, 0.2000],\n",
       "         [6.9000, 3.1000, 5.4000, 2.1000],\n",
       "         [6.8000, 3.0000, 5.5000, 2.1000],\n",
       "         [5.2000, 2.7000, 3.9000, 1.4000],\n",
       "         [5.6000, 3.0000, 4.1000, 1.3000],\n",
       "         [5.5000, 2.5000, 4.0000, 1.3000],\n",
       "         [7.7000, 3.0000, 6.1000, 2.3000],\n",
       "         [5.9000, 3.0000, 4.2000, 1.5000],\n",
       "         [7.7000, 2.6000, 6.9000, 2.3000],\n",
       "         [6.6000, 3.0000, 4.4000, 1.4000],\n",
       "         [6.7000, 3.1000, 5.6000, 2.4000],\n",
       "         [5.8000, 2.7000, 4.1000, 1.0000],\n",
       "         [5.4000, 3.0000, 4.5000, 1.5000],\n",
       "         [5.5000, 2.4000, 3.7000, 1.0000],\n",
       "         [4.4000, 2.9000, 1.4000, 0.2000],\n",
       "         [6.0000, 2.2000, 4.0000, 1.0000],\n",
       "         [5.4000, 3.4000, 1.5000, 0.4000],\n",
       "         [5.6000, 2.5000, 3.9000, 1.1000],\n",
       "         [4.6000, 3.2000, 1.4000, 0.2000],\n",
       "         [5.5000, 2.6000, 4.4000, 1.2000],\n",
       "         [7.0000, 3.2000, 4.7000, 1.4000],\n",
       "         [6.7000, 3.1000, 4.4000, 1.4000],\n",
       "         [4.6000, 3.6000, 1.0000, 0.2000],\n",
       "         [5.8000, 4.0000, 1.2000, 0.2000],\n",
       "         [6.3000, 3.4000, 5.6000, 2.4000],\n",
       "         [6.1000, 2.9000, 4.7000, 1.4000],\n",
       "         [5.7000, 3.8000, 1.7000, 0.3000],\n",
       "         [5.0000, 3.4000, 1.5000, 0.2000],\n",
       "         [6.1000, 2.6000, 5.6000, 1.4000],\n",
       "         [7.2000, 3.2000, 6.0000, 1.8000],\n",
       "         [5.7000, 2.8000, 4.1000, 1.3000],\n",
       "         [5.1000, 3.5000, 1.4000, 0.2000],\n",
       "         [7.9000, 3.8000, 6.4000, 2.0000],\n",
       "         [6.3000, 2.7000, 4.9000, 1.8000],\n",
       "         [5.1000, 3.8000, 1.9000, 0.4000],\n",
       "         [5.8000, 2.8000, 5.1000, 2.4000],\n",
       "         [5.1000, 3.7000, 1.5000, 0.4000],\n",
       "         [4.8000, 3.0000, 1.4000, 0.3000],\n",
       "         [6.9000, 3.2000, 5.7000, 2.3000],\n",
       "         [5.7000, 3.0000, 4.2000, 1.2000],\n",
       "         [6.5000, 3.0000, 5.8000, 2.2000],\n",
       "         [4.7000, 3.2000, 1.3000, 0.2000],\n",
       "         [5.5000, 2.3000, 4.0000, 1.3000],\n",
       "         [4.8000, 3.4000, 1.9000, 0.2000],\n",
       "         [6.8000, 2.8000, 4.8000, 1.4000],\n",
       "         [5.0000, 3.3000, 1.4000, 0.2000],\n",
       "         [5.0000, 3.5000, 1.3000, 0.3000],\n",
       "         [5.1000, 3.5000, 1.4000, 0.3000],\n",
       "         [5.0000, 3.5000, 1.6000, 0.6000],\n",
       "         [6.1000, 3.0000, 4.6000, 1.4000],\n",
       "         [4.9000, 2.4000, 3.3000, 1.0000],\n",
       "         [5.0000, 3.0000, 1.6000, 0.2000],\n",
       "         [5.1000, 2.5000, 3.0000, 1.1000],\n",
       "         [6.3000, 2.8000, 5.1000, 1.5000],\n",
       "         [6.0000, 2.9000, 4.5000, 1.5000],\n",
       "         [5.7000, 2.6000, 3.5000, 1.0000],\n",
       "         [4.6000, 3.4000, 1.4000, 0.3000],\n",
       "         [4.4000, 3.0000, 1.3000, 0.2000],\n",
       "         [5.7000, 2.5000, 5.0000, 2.0000],\n",
       "         [6.6000, 2.9000, 4.6000, 1.3000],\n",
       "         [6.8000, 3.2000, 5.9000, 2.3000],\n",
       "         [6.3000, 3.3000, 6.0000, 2.5000],\n",
       "         [5.0000, 3.4000, 1.6000, 0.4000],\n",
       "         [6.4000, 2.9000, 4.3000, 1.3000]]),\n",
       " tensor([1, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 1, 1, 2, 2, 0, 2, 0, 1, 0, 0, 2, 2,\n",
       "         0, 2, 2, 0, 1, 2, 1, 2, 1, 0, 2, 1, 2, 1, 2, 0, 1, 0, 2, 2, 1, 1, 1, 2,\n",
       "         1, 2, 1, 2, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 2, 1, 0, 0, 2, 2, 1,\n",
       "         0, 2, 2, 0, 2, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 2, 1,\n",
       "         1, 0, 0, 2, 1, 2, 2, 0, 1])]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "next(iter(iris_loader))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A Quick Note on Torchvision\n",
    "PyTorch offers another powerful dataset tool called <a href='https://pytorch.org/docs/stable/torchvision/index.html'><tt><strong>torchvision</strong></tt></a>, which is useful when working with image data. We'll go into a lot more detail in the Convolutional Neural Network (CNN) section. For now, just know that torchvision offers built-in image datasets like <a href='https://en.wikipedia.org/wiki/MNIST_database'>MNIST</a> and <a href='https://en.wikipedia.org/wiki/CIFAR-10'>CIFAR-10</a>, as well as tools for transforming images into tensors."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
